import os
import commands

class BaseCompiler:

	def __init__(self):
		path = BaseCompiler.__module__.split('.')[:-1]
		path = os.path.join(*path)
		self.path = os.path.abspath(path)
		self.crear_directorio_compilador()

	# FIXME: Arreglar esto para manejar las exceptiones
	def crear_archivo_fuente(self, codigo, path):
		archivo = open(path, 'w')
		archivo.write(codigo)
		archivo.flush()
		archivo.close()
		return True
	
	def crear_archivo_prueba(self, codigo, path):
		archivo = open(path, 'w')
		archivo.write(codigo)
		archivo.flush()
		archivo.close()
		return True

	def crear_directorio_compilador(self):
		directorio = self.get_directorio()
		if not os.path.exists(directorio):
			os.mkdir(directorio)

	def get_directorio(self):
		return '%s/fuentes/%s'%(self.path, self.__class__.__name__)
	
	def get_nombre_archivo_codigo(self, usuario):
		return '%s/%s.%s'%(self.get_directorio(),
						   str(usuario),
						   self.get_extension())
	
	def get_nombre_archivo_compilado(self, usuario, codigo):
		return '%s/%s.%s'%(self.get_directorio(),
						   str(usuario),
						   self.get_extension_compilado()
					   )
	
	def get_nombre_archivo_prueba(self, usuario):
		return '%s/%sTest'%(self.get_directorio(),
						   str(usuario))

	def compilar(self, codigo, usuario):
		path = self.get_nombre_archivo_codigo(usuario)
		if self.crear_archivo_fuente(codigo, path):
			comando = self.comando_compilar()%(path)
			return self.realizar_comando(comando)
		return (1, 'No Compilo')

	def ejecutar(self, codigo, entrada, usuario):
		pathCodigo = self.get_nombre_archivo_codigo(usuario)
		if self.crear_archivo_fuente(codigo, pathCodigo):
			comando = self.comando_compilar()%(pathCodigo)
			comando = self.realizar_comando(comando)
			if comando[0] == 0:
				pathCodigo = self.get_nombre_archivo_compilado(usuario, codigo)
				# TODO esto va a ser para soportar lectura de archivos como entrada
				# pathPrueba = self.get_nombre_archivo_prueba(usuario)
				# self.crear_archivo_prueba(entrada, pathPrueba)
				comando = self.comando_ejecutar()%(pathCodigo, entrada)
				return self.realizar_comando(comando)
		return (1, 'No pudo ejecutar %s'%(str(comando)))
	
	def realizar_comando(self, comando):
		os.chdir(self.get_directorio())
		resultado = commands.getstatusoutput(comando)
		os.chdir('../../../../')
		return resultado
